<html>
    <head>
        <title>导航属性/外键</title>
    </head>
    <body>
        <script>
            /*
                 2、导航属性/外键

                                        支持将扩展属性添加到另一个实体（外键）的ID的实体。

                                        eg：  将部门与用户相关联

                                                ObjectExtensionManager.Instance.Modules()
                                                                        .ConfigureIdentity(identity =>
                                                                        {
                                                                            identity.ConfigureUser(user =>
                                                                            {
                                                                                user.AddOrUpdateProperty<Guid>(
                                                                                    "DepartmentId",
                                                                                    property =>
                                                                                    {
                                                                                        property.UI.Lookup.Url = "/api/departments";
                                                                                        property.UI.Lookup.DisplayPropertyName = "name";
                                                                                    }
                                                                                );
                                                                            });
                                                                        });

                                                UI.Lookup.Url选项采用URL来获取部门列表以在编辑/创建表单上进行选择。

                                                此端点可以是典型控制器、自动API控制器或返回正确JSON响应的任何类型的端点。

                                        返回固定部门列表的示例实现（在现实生活中，你从数据源获取列表）：
                                        
                                                [Route("api/departments")]
                                                public class DepartmentController : AbpController
                                                {
                                                    [HttpGet]
                                                    public async Task<ListResultDto<DepartmentDto>> GetAsync()
                                                    {
                                                        return new ListResultDto<DepartmentDto>(
                                                            new[]
                                                            {
                                                                new DepartmentDto
                                                                {
                                                                    Id = Guid.Parse("6267f0df-870f-4173-be44-d74b4b56d2bd"),
                                                                    Name = "Human Resources"
                                                                },
                                                                new DepartmentDto
                                                                {
                                                                    Id = Guid.Parse("21c7b61f-330c-489e-8b8c-80e0a78a5cc5"),
                                                                    Name = "Production"
                                                                }
                                                            }
                                                        );
                                                    }
                                                } 

                                        此Api 返回这样的Json响应：

                                                {
                                                    "items": [{
                                                        "id": "6267f0df-870f-4173-be44-d74b4b56d2bd",
                                                        "name": "Human Resources"
                                                    }, {
                                                        "id": "21c7b61f-330c-489e-8b8c-80e0a78a5cc5",
                                                        "name": "Production"
                                                    }]
                                                }

                                        ABP现在可以在创建或编辑用户时显示自动完成选择组件来选择部门：

                                        并在数据表上显示部门名称：


                                    ★、Lookup Options 查找选项：

                                                 UI.Lookup有以下选项来自定义如何读取从Url返回的响应：
                                                 
                                                 ①、Url：获取目标实体列表的端点。这用于编辑和创建表单。

                                                 ②、DisplayPropertyName：JSON响应中的属性，用于读取要在UI上显示的目标实体的显示名称。默认值：text。

                                                 ③、ValuePropertyName：JSON响应中读取目标实体ID的属性。默认值：id。

                                                 ④、FilterParamName：ABP允许在编辑/创建表单上搜索/过滤实体列表。
                                                   
                                                                     如果目标列表包含大量项目，这尤其有用。
                                                                     
                                                                     在这种情况下，你可以返回有限的列表（例如前100名）并允许用户在列表中搜索。
                                                                     
                                                                     ABP使用此选项的名称向服务器发送过滤文本（作为简单的查询字符串）。默认值：filter。

                                                 ⑤、ResultListPropertyName：
                                                        
                                                                    默认情况下，返回的JSON结果应包含items数组中的实体列表。你可以更改此字段的名称。默认值：items。


                                    ★、Lookup Properties: 是如何工作的

                                                你可能想知道ABP如何在上面的数据表上显示部门名称。

                                                很容易理解如何填写编辑和创建表单的下拉列表：ABP向给定的URL发出AJAX请求。每当用户键入以过滤项目时，它都会重新请求

                                                但是，对于数据表，UI上显示多个项目，执行单独的AJAX调用以获取每行的部门显示名称不会那么有效

                                                相反，除了外部实体的Id之外，外部实体的显示名称也保存为实体的额外属性（请参阅Entiies文档的Extra Properties部分）。
                                                
                                                如果检查数据库，你可以在数据库表的ExtraProperties字段中看到DepartmentId_Text：

                                                            {"DepartmentId":"21c7b61f-330c-489e-8b8c-80e0a78a5cc5","DepartmentId_Text":"Production"}

                                                因此，这是一种数据重复。如果你的目标实体名称稍后在数据库中发生更改，则没有自动同步系统。
                                                
                                                系统按预期工作，但你会在数据表上看到旧名称。如果这对你来说是个问题，你应该注意在实体显示名称更改时更新此信息。
            */
        </script>
    </body>
</html>